"""
配置文件
管理数据库连接和应用配置
"""

from pydantic_settings import BaseSettings
from pydantic import Field, field_validator


class Settings(BaseSettings):
    """应用配置类"""

    # =============================================================================
    # 应用基本配置
    # =============================================================================
    app_name: str = Field(default="Head Detection API", description="应用名称")
    app_version: str = Field(default="1.0.0", description="应用版本")
    app_description: str = Field(
        default="使用YOLOv8进行人头检测的API", description="应用描述"
    )

    # =============================================================================
    # 服务器配置
    # =============================================================================
    host: str = Field(default="0.0.0.0", description="服务器主机地址")
    port: int = Field(default=8000, ge=1, le=65535, description="服务器端口")
    debug: bool = Field(default=False, description="是否启用调试模式")
    reload: bool = Field(default=False, description="是否启用自动重载")
    workers: int = Field(default=1, ge=1, description="工作进程数量")

    # =============================================================================
    # 日志配置
    # =============================================================================
    log_level: str = Field(default="INFO", description="日志级别")
    log_format: str = Field(
        default="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
        description="日志格式",
    )

    # =============================================================================
    # 设备服务配置
    # =============================================================================
    device_svc_host: str = Field(default="localhost", description="设备服务主机")
    device_svc_port: int = Field(default=8088, description="设备服务端口")
    # 是否使用内置的设备 Mock 数据（开启后将不请求真实设备服务）
    use_mock_devices: bool = Field(default=False, description="是否启用设备Mock数据")

    @field_validator("log_level")
    @classmethod
    def validate_log_level(cls, v):
        """验证日志级别"""
        valid_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
        if v.upper() not in valid_levels:
            raise ValueError(f"日志级别必须是以下之一: {valid_levels}")
        return v.upper()

    class Config:
        env_file = [".env.local", ".env"]  # 优先读取 .env.local
        env_file_encoding = "utf-8"
        env_prefix = ""
        case_sensitive = False


# 配置加载函数
def load_settings() -> Settings:
    """
    加载配置，支持环境变量覆盖

    Returns:
        配置实例
    """
    try:
        settings = Settings()
        return settings
    except Exception as e:
        print(f"❌ 配置加载失败: {e}")
        raise


# 全局配置实例
settings = load_settings()
